/**
 * cone-service: fetch.js
 * Description: 纯粹的请求数据接口封装，不做业务处理和跳转处理
 */

const _fetch = require('node-fetch');
const querystring = require('querystring');
const tool = require('./tool.js');
const logger = require('./logger.js');

/**
 * 请求http接口
 * @param options {url,basePath,data,method,dataType,headers,timeout}
 * @returns {Promise<*>}
 */
async function fetch(options) {
    if (options && options.url) {
        let ctx = options.ctx || {};
        //TODO:务必要删除ctx属性，否则继承语句会死循环
        delete options["ctx"];
        let _url = (options.basePath || '') + options.url;
        let opts = {
            method: options.method || 'GET',
            headers: options.headers,
            timeout: options.timeout || 10000
        };
        let headers = {
            Cookie: ctx.header.cookie,
            referer: ctx.href
        };
        opts.headers = {
            ...headers,
            ...opts.headers
        }
        let dataType = options.dataType || 'json';
        if (opts.method === 'GET') {
            let _query = querystring.stringify(options.data);
            if (_query) {
                if (_url.indexOf("?") !== -1) {
                    _url += "&" + _query;
                }
                else {
                    _url += "?" + _query;
                }
            }
        }
        else if (opts.method === 'POST') {
            opts.body = options.data;
        }
        let res = null;

        res = await _fetch(_url, opts)
        if (res.status == 200) {
            let data = await res.text()
            if (dataType == "json") {
                try {
                    data = JSON.parse(data)
                }
                catch (err) {
                    logger.error('fetch JSON.parse error:', err.message)
                }
            }
            // 此处判断是否返回结果是false 包括success不为true 或者code!=0 或者code!=200（前提是要有code字段）
            if (typeof data == 'object') {
                if(data.hasOwnProperty('success') && !data.success || 
                data.hasOwnProperty('code') && data.code != 0 && data.code != 200){
                    logger.error(`fetch url:${_url}, error:${JSON.stringify(data)}`)
                }
            }
            else if(data.indexOf('<html')!=-1){
                // 返回string 而且包含html字样 认为是后端返回错误页HTML片段
                logger.error(`fetch url:${_url}, error:${JSON.stringify(data)}`)
            }
            tool.processAuth(ctx, data);
            return { success: true, data, error: '' }
        }
        else {
            const result = { success: false, data: null, error: `status:${res.status},statusText:${res.statusText}` }
            logger.error(`fetch url:${_url}, error:${result.error}`)
            return result
        }

    }
    else {
        throw Error("fetch Error: options is illegal!")
    }
}

module.exports = fetch